#!/bin/bash

# CPU负载控制脚本
# 用法: ./cpu_load.sh [CPU负载百分比] [持续时间(秒)] [核心数量]

# 默认参数
load=${1:-50}       # 默认50%的CPU负载
duration=${2:-60}   # 默认运行60秒
cores=${3:-1}       # 默认使用1个核心

# 验证输入参数
if [[ $load -lt 0 || $load -gt 100 ]]; then
    echo "错误: CPU负载必须在0-100之间"
    exit 1
fi

echo "开始CPU负载测试:"
echo "CPU负载: $load%"
echo "持续时间: $duration 秒"
echo "使用核心数: $cores"
echo "按 Ctrl+C 可随时终止测试"

# 计算负载和休眠时间的比例
# 例如: 负载50%意味着工作0.5秒，然后休眠0.5秒
work_time=$(echo "scale=2; $load/100" | bc)
sleep_time=$(echo "scale=2; (100-$load)/100" | bc)

# 创建所需数量的子进程
for ((i=1; i<=cores; i++))
do
    (
        # 记录开始时间
        start_time=$(date +%s)
        end_time=$((start_time + duration))

        # 在指定的持续时间内运行
        while [ $(date +%s) -lt $end_time ]
        do
            # 工作阶段 - 执行密集计算来消耗CPU
            work_start=$(date +%s.%N)
            work_end=$(echo "$work_start + $work_time" | bc)
            
            while [ $(date +%s.%N | bc) -lt $work_end ]
            do
                # 密集计算
                echo "scale=10; 4*a(1)" | bc -l > /dev/null
            done
            
            # 休眠阶段 - 允许CPU休息
            sleep $sleep_time
        done
    ) &
    echo "已启动核心 $i 的负载进程 (PID: $!)"
done

# 等待所有子进程完成
wait

echo "CPU负载测试完成!" 